package thread;

/**
 * 静态方法的同步
 * 当一个静态方法使用synchronized修饰之后,该方法一定具有同步效果
 *
 * 静态方法上使用synchronized时,同步监视器对象时当前类的对象了(Class的实例)
 * Class类称为类对象 JVM加载一个类时会实现一个Class实例用来表示加载的这个类,
 * 因此每个被JVM加载的类都有且只有一个Class的实例预支对应,而这个Class实例就
 * 称为这个类的类对象
 * 类对象会在后期反射的知识点讲解
 *
 * @author Luka
 * @date 2021/06/04 16:15
 **/
public class SyncDemo3 {
    public static void main(String[] args) {
        Boo b1 = new Boo();
        Boo b2 = new Boo();
        Thread t1 = new Thread(){
            @Override
            public void run() {
                b1.dosome();
            }
        };
        Thread t2 = new Thread(){
            @Override
            public void run() {
                b2.dosome();
            }
        };
        t1.start();
        t2.start();
    }
}

class Boo{
    public static void dosome(){
        /*
            静态方法中适用同步块时,通常指定的锁对象还是当前类的类对象
            获取方式为:当前的类名.class
         */
        synchronized (Boo.class) {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "正在执行dosome方法...");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("任务执行完毕");
        }
    }
}